#pragma once
#include "testing.h"

class Cipher {
public:
    /*  A virtual destructor */
    virtual ~Cipher() {};
    /*  This method is abstract, there is
        no definition */
    virtual std::string encrypt(const std::string &x) = 0;
    virtual std::string decrypt(const std::string &x) = 0;
};

class CaeserCipher :public Cipher {
public:
    CaeserCipher();
    std::string encrypt(const std::string& x);
    std::string decrypt(const std::string& x);
};

class ReverseCipher :public Cipher {
public:
    ReverseCipher();
    std::string encrypt(const std::string& x);
    std::string decrypt(const std::string& x);
};

void testCipher();